# 1.1定义工厂函数封装应用的创建过程, 并通过参数指定应用对应的配置类型
from flask import Flask, current_app, Config
from config import config_dict


# 工厂函数: 根据参数需求, 内部封装对象的创建过程
def create_app(config_type):
    """封装应用的创建过程"""

    # 创建应用
    flask_app = Flask(__name__)

    # 根据配置类型取出对应的配置子类
    config_class = config_dict[config_type]

    # 加载普通配置
    flask_app.config.from_object(config_class)

    # 2.由于动态创建应用(app失效), 不能通过app.route定义路由
    # 添加路由规则  (实际开发中使用较少, 以蓝图定义路由为主)
    flask_app.add_url_rule('/', index.__name__, index)

    # 注册蓝图对象  蓝图可以正常使用
    # from home import home_blu
    # flask_app.register_blueprint(home_blu)

    return flask_app


"""
动态创建应用注意:
    动态创建应用, 通过 app = create_app('dev') 代码生成的Flask应用将会失效
        需要使用 app 的时候, 可以使用 current_app来代替 (只能在请求范围中使用)
        将无法通过 app.route()来定义路由, 但是 蓝图定义路由仍然有效
"""


# 定义视图函数, 不添加app.route()装饰器, 通过 添加路由规则 的方式手动定义路由
def index():
    print(current_app.config.get('SQL_URL'))

    return "index"


# # 创建应用对象
# # 通过代码调用函数 create_app('dev') 创建应用, 仍然在代码中写死了 配置类型dev
# # FLASK提供的环境变量 FLASK_APP 允许 以调用函数的形式动态创建应用
# #     格式: FLASK_APP="应用所在模块:工厂函数名(配置类型)"
# # 环境变量&终端命令 启动程序:
# # $ export FLASK_APP="main:create_app('dev')"  # 设置环境变量, 通过调用函数 设置配置并动态创建Flask应用
# # $ flask run  # 运行web程序

# app = create_app('dev')
#
#
# @app.route("/")
# def index():
#     print(app.config.get('SQL_URL'))
#     return "index"
#
#
# if __name__ == '__main__':
#     app.run()
